package com.gqr.threadcoreknowledge.stopthreads;

/**
 * 生产实际中 最佳中断实践1
 * catchInterruptedException之后的优先选择：在方法签名中抛出异常
 * 那么在run()就会强制try/catch处理
 */
public class RightWayStopThreadInProd implements Runnable {

    @Override
    public void run() {
        while (true && !Thread.currentThread().isInterrupted()) {
            System.out.println("go"); // 假设这是业务代码 要去执行做啥东西
            try {
                // 使用throwInMethod正确方式 run使用try/catch
                // 请看RunThrowException
                throwInMethod();
            } catch (InterruptedException e) {
                // 保存日志 停止程序
                System.out.println("保存日志");
                e.printStackTrace();
//                throw new RuntimeException();
            }
        }
    }

    // 正确方式把
    private void throwInMethod() throws InterruptedException {
        Thread.sleep(2000);
    }

    // 错误方式 使用try/catch
    // 看似try/catch没有任何问题
    // 但是上层的run方法内 业务逻辑没有中断还在不停的运行
    // 相当于异常在子方法里吞住了 没有往上层代码上报
   /* private void throwInMethod() {
        try {
            Thread.sleep(2000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }*/


    public static void main(String[] args) throws InterruptedException {
        Thread thread = new Thread(new RightWayStopThreadInProd());
        thread.start();
        Thread.sleep(1000);
        thread.interrupt();
    }
}
